Code Coverage
 
Lines
Branches
Paths
Functions and Methods
Classes and Traits
Total
69.65% covered (warning)
69.65%
140 / 201
54.62% covered (warning)
54.62%
71 / 130
9.13% covered (danger)
9.13%
19 / 208
26.32% covered (danger)
26.32%
5 / 19
CRAP
0.00% covered (danger)
0.00%
0 / 1
FilterDAO
70.35% covered (warning)
70.35%
140 / 199
54.62% covered (warning)
54.62%
71 / 130
9.13% covered (danger)
9.13%
19 / 208
52.63% covered (warning)
52.63%
10 / 19
3136.95
0.00% covered (danger)
0.00%
0 / 1
 configureObject
57.69% covered (warning)
57.69%
15 / 26
48.00% covered (danger)
48.00%
12 / 25
1.25% covered (danger)
1.25%
1 / 80
0.00% covered (danger)
0.00%
0 / 1
150.67
 insertObject
100.00% covered (success)
100.00%
22 / 22
75.00% covered (warning)
75.00%
3 / 4
50.00% covered (danger)
50.00%
1 / 2
100.00% covered (success)
100.00%
1 / 1
2.50
 getObject
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getObjectById
100.00% covered (success)
100.00%
8 / 8
85.71% covered (warning)
85.71%
6 / 7
50.00% covered (danger)
50.00%
2 / 4
100.00% covered (success)
100.00%
1 / 1
4.12
 getObjectsByClass
100.00% covered (success)
100.00%
7 / 7
71.43% covered (warning)
71.43%
5 / 7
25.00% covered (danger)
25.00%
1 / 4
100.00% covered (success)
100.00%
1 / 1
6.80
 getObjectsByGroupAndClass
100.00% covered (success)
100.00%
9 / 9
71.43% covered (warning)
71.43%
5 / 7
25.00% covered (danger)
25.00%
1 / 4
100.00% covered (success)
100.00%
1 / 1
6.80
 getObjectsByTypeDescription
0.00% covered (danger)
0.00%
0 / 28
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 58
0.00% covered (danger)
0.00%
0 / 1
90
 getObjectsByGroup
100.00% covered (success)
100.00%
14 / 14
85.71% covered (warning)
85.71%
12 / 14
4.17% covered (danger)
4.17%
1 / 24
100.00% covered (success)
100.00%
1 / 1
37.68
 updateObject
90.91% covered (success)
90.91%
20 / 22
66.67% covered (warning)
66.67%
4 / 6
25.00% covered (danger)
25.00%
1 / 4
0.00% covered (danger)
0.00%
0 / 1
6.80
 deleteObject
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 deleteObjectById
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 updateDataObjectSettings
85.71% covered (warning)
85.71%
6 / 7
83.33% covered (warning)
83.33%
5 / 6
25.00% covered (danger)
25.00%
1 / 4
0.00% covered (danger)
0.00%
0 / 1
6.80
 getAdditionalFieldNames
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getLocaleFieldNames
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 _newDataObject
72.73% covered (warning)
72.73%
8 / 11
66.67% covered (warning)
66.67%
6 / 9
14.29% covered (danger)
14.29%
1 / 7
0.00% covered (danger)
0.00%
0 / 1
20.74
 _fromRow
93.33% covered (success)
93.33%
14 / 15
66.67% covered (warning)
66.67%
2 / 3
50.00% covered (danger)
50.00%
1 / 2
0.00% covered (danger)
0.00%
0 / 1
2.50
 _populateSubFilters
22.22% covered (danger)
22.22%
2 / 9
33.33% covered (danger)
33.33%
2 / 6
33.33% covered (danger)
33.33%
1 / 3
0.00% covered (danger)
0.00%
0 / 1
5.67
 _insertSubFilters
40.00% covered (danger)
40.00%
2 / 5
33.33% covered (danger)
33.33%
2 / 6
25.00% covered (danger)
25.00%
1 / 4
0.00% covered (danger)
0.00%
0 / 1
6.80
 _deleteSubFiltersByParentFilterId
62.50% covered (warning)
62.50%
5 / 8
50.00% covered (danger)
50.00%
2 / 4
33.33% covered (danger)
33.33%
1 / 3
0.00% covered (danger)
0.00%
0 / 1
3.19
1<?php
2
3/**
4 * @file classes/filter/FilterDAO.php
5 *
6 * Copyright (c) 2014-2021 Simon Fraser University
7 * Copyright (c) 2000-2021 John Willinsky
8 * Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
9 *
10 * @class FilterDAO
11 *
12 * @ingroup filter
13 *
14 * @see PersistableFilter
15 *
16 * @brief Operations for retrieving and modifying Filter objects.
17 *
18 * The filter DAO acts as a filter registry. It allows filter providers to
19 * register transformations and filter consumers to identify available
20 * transformations that convert a given input type into a required output type.
21 *
22 * Transformations are defined as a combination of a filter class, a pair of
23 * input/output type specifications supported by that filter implementation
24 * and a set of configuration parameters that customize the filter.
25 *
26 * Transformations can be based on filter templates. A template is defined as
27 * a filter instance without parameterization. A flag is used to distinguish
28 * filter templates from fully parameterized filter instances.
29 *
30 * Different filters that perform semantically related transformations (e.g.
31 * all citation parsers or all citation output filters) are clustered into
32 * filter groups (@see FilterGroup).
33 *
34 * The following additional conditions apply:
35 * 1) A single filter class may support several transformations, i.e. distinct
36 *    combinations of input and output types or distinct parameterizations.
37 *    Therefore the filter DAO must be able to handle several registry entries
38 *    per filter class.
39 * 2) The DAO must take care to only select such transformations that are
40 *    supported by the current runtime environment.
41 * 3) The DAO implementation must be scalable, fast and memory efficient.
42 */
43
44namespace PKP\filter;
45
46use APP\core\Application;
47use Exception;
48use PKP\core\DataObject;
49use PKP\db\DAORegistry;
50use PKP\db\DAOResultFactory;
51
52class FilterDAO extends \PKP\db\DAO
53{
54    /** @var array names of additional settings for the currently persisted/retrieved filter */
55    public $additionalFieldNames;
56
57    /** @var array names of localized settings for the currently persisted/retrieved filter */
58    public $localeFieldNames;
59
60
61    /**
62     * Instantiates a new filter from configuration data and then
63     * installs it.
64     *
65     * @param array $settings key-value pairs that can be directly written
66     *  via \PKP\core\DataObject::setData().
67     * @param int $contextId the context the filter should be installed into
68     * @param array $subFilters sub-filters (only allowed when the filter is a CompositeFilter)
69     * @param bool $persist whether to actually persist the filter
70     *
71     * @return PersistableFilter|boolean the new filter if installation successful, otherwise 'false'.
72     */
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
86            return false;
87        }
88
89        // Instantiate the filter.
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
95        } else {
96            // Could not find class
97            return false;
98        }
99        if (!$filter) {
100            return false;
101        }
102
103        // Is this a template?
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
109                throw new Exception('Filter is not expected type CompositeFilter!');
110            }
111            if (!is_array($subFilters)) {
112                throw new Exception('Subfilters must be an array!');
113            }
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
129                return false;
130            }
131        }
132
133        return $filter;
134    }
135
136    /**
137     * Insert a new filter instance (transformation).
138     *
139     * @param $filter The configured filter instance to be persisted
140     *
141     * @return The new filter id
142     */
143    public function insertObject(PersistableFilter $filter, ?int $contextId = Application::SITE_CONTEXT_ID): int
144    {
145        $filterGroup = $filter->getFilterGroup();
146        assert($filterGroup->getSymbolic() != FILTER_GROUP_TEMPORARY_ONLY);
147
148        $this->update(
149            sprintf('INSERT INTO filters
150                (filter_group_id, context_id, display_name, class_name, is_template, parent_filter_id, seq)
151                VALUES (?, ?, ?, ?, ?, ?, ?)'),
152            [
153                $filterGroup->getId(),
154                $contextId,
155                $filter->getDisplayName(),
156                $filter->getClassName(),
157                $filter->getIsTemplate() ? 1 : 0,
158                $filter->getParentFilterId(),
159                (int) $filter->getSequence()
160            ]
161        );
162        $filter->setId((int)$this->getInsertId());
163        $this->updateDataObjectSettings(
164            'filter_settings',
165            $filter,
166            ['filter_id' => $filter->getId()]
167        );
168
169        // Recursively insert sub-filters.
170        $this->_insertSubFilters($filter);
171
172        return $filter->getId();
173    }
174
175    /**
176     * Retrieve a configured filter instance (transformation)
177     */
178    public function getObject(PersistableFilter $filter): PersistableFilter
179    {
180        return $this->getObjectById($filter->getId());
181    }
182
183    /**
184     * Retrieve a configured filter instance (transformation) by id.
185     */
186    public function getObjectById(int $filterId, bool $allowSubfilter = false): ?PersistableFilter
187    {
188        $result = $this->retrieve(
189            'SELECT * FROM filters
190            WHERE ' . ($allowSubfilter ? '' : 'parent_filter_id IS NULL AND ') . '
191            filter_id = ?',
192            [(int) $filterId]
193        );
194        $row = $result->current();
195        return $row ? $this->_fromRow((array) $row) : null;
196    }
197
198    /**
199     * Retrieve a result set with all filter instances
200     * (transformations) that are based on the given class.
201     *
202     * @param bool $getTemplates set true if you want filter templates
203     *  rather than actual transformations
204     *
205     * @return DAOResultFactory<PersistableFilter>
206     */
207    public function getObjectsByClass(
208        string $className,
209        ?int $contextId = Application::SITE_CONTEXT_ID,
210        bool $getTemplates = false,
211        bool $allowSubfilters = false
212    ): DAOResultFactory {
213        $result = $this->retrieve(
214            'SELECT * FROM filters
215                WHERE COALESCE(context_id, 0) = ? AND
216                LOWER(class_name) = LOWER(?) AND
217            ' . ($allowSubfilters ? '' : ' parent_filter_id IS NULL AND ') . '
218            ' . ($getTemplates ? ' is_template = 1' : ' is_template = 0'),
219            [(int) $contextId, $className]
220        );
221
222        return new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
223    }
224
225    /**
226     * Retrieve a result set with all filter instances
227     * (transformations) within a given group that are
228     * based on the given class.
229     *
230     * @param bool $getTemplates set true if you want filter templates
231     *  rather than actual transformations
232     *
233     * @return DAOResultFactory<PersistableFilter>
234     */
235    public function getObjectsByGroupAndClass(
236        string $groupSymbolic,
237        string $className,
238        ?int $contextId = Application::SITE_CONTEXT_ID,
239        bool $getTemplates = false,
240        bool $allowSubfilters = false
241    ): DAOResultFactory {
242        $result = $this->retrieve(
243            'SELECT f.* FROM filters f' .
244            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
245            ' WHERE fg.symbolic = ? AND COALESCE(f.context_id, 0) = ? AND LOWER(f.class_name) = LOWER(?)' .
246            ' ' . ($allowSubfilters ? '' : 'AND f.parent_filter_id IS NULL') .
247            ' AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0'),
248            [$groupSymbolic, (int) $contextId, $className]
249        );
250
251        return new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
252    }
253
254    /**
255     * Retrieve filters based on the supported input/output type.
256     *
257     * @param string $inputTypeDescription a type description that has to match the input type
258     * @param string $outputTypeDescription a type description that has to match the output type
259     *  NB: input and output type description can contain wildcards.
260     * @param mixed $data the data to be matched by the filter. If no data is given then
261     *  all filters will be matched.
262     * @param bool $dataIsInput true if the given data object is to be checked as
263     *  input type, false to check against the output type.
264     *
265     * @return PersistableFilter[] a list of matched filters.
266     */
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
282            // Get all adapter filters.
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
301            return $filterCache[$filterCacheKey];
302        }
303
304        // Build the object-specific adapter cache.
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
325
326    /**
327     * Retrieve filter instances configured for a given context
328     * that belong to a given filter group.
329     *
330     * Only filters supported by the current run-time environment
331     * will be returned when $checkRuntimeEnvironment is set to 'true'.
332     *
333     * @param $contextId returns filters from the site context and
334     *  the given filters of all contexts if set to null
335     * @param $getTemplates set true if you want filter templates
336     *  rather than actual transformations
337     * @param $checkRuntimeEnvironment whether to remove filters
338     *  from the result set that do not match the current run-time environment.
339     *
340     * @return filter instances (transformations) in the given group
341     */
342    public function getObjectsByGroup(
343        string $groupSymbolic,
344        ?int $contextId = Application::SITE_CONTEXT_ID_ALL,
345        bool $getTemplates = false,
346        bool $checkRuntimeEnvironment = true
347    ): array {
348        // 1) Get all available transformations in the group.
349        $result = $this->retrieve(
350            'SELECT f.* FROM filters f' .
351            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
354            '  AND f.parent_filter_id IS NULL',
355            [$groupSymbolic]
356        );
357
358
359        // 2) Instantiate and return all transformations in the
360        //    result set that comply with the current runtime
361        //    environment.
362        $matchingFilters = [];
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
367            }
368        }
369
370        return $matchingFilters;
371    }
372
373    /**
374     * Update an existing filter instance (transformation).
375     */
376    public function updateObject(PersistableFilter $filter): void
377    {
378        $filterGroup = $filter->getFilterGroup();
379        assert($filterGroup->getSymbolic() != FILTER_GROUP_TEMPORARY_ONLY);
380
381        $this->update(
382            'UPDATE    filters
383            SET    filter_group_id = ?,
384                display_name = ?,
385                class_name = ?,
386                is_template = ?,
387                parent_filter_id = ?,
388                seq = ?
389            WHERE filter_id = ?',
390            [
391                (int) $filterGroup->getId(),
392                $filter->getDisplayName(),
393                $filter->getClassName(),
394                $filter->getIsTemplate() ? 1 : 0,
395                $filter->getParentFilterId(),
396                (int) $filter->getSequence(),
397                (int) $filter->getId()
398            ]
399        );
400        $this->updateDataObjectSettings(
401            'filter_settings',
402            $filter,
403            ['filter_id' => $filter->getId()]
404        );
405
406        // Do we update a composite filter?
407        if ($filter instanceof \PKP\filter\CompositeFilter) {
408            // Delete all sub-filters
409            $this->_deleteSubFiltersByParentFilterId($filter->getId());
410
411            // Re-insert sub-filters
412            $this->_insertSubFilters($filter);
413        }
414    }
415
416    /**
417     * Delete a filter instance (transformation).
418     */
419    public function deleteObject(PersistableFilter $filter): bool
420    {
421        return $this->deleteObjectById($filter->getId());
422    }
423
424    /**
425     * Delete a filter instance (transformation) by id.
426     */
427    public function deleteObjectById(int $filterId): bool
428    {
429        $this->update('DELETE FROM filters WHERE filter_id = ?', [$filterId]);
430        $this->update('DELETE FROM filter_settings WHERE filter_id = ?', [$filterId]);
431        $this->_deleteSubFiltersByParentFilterId($filterId);
432        return true;
433    }
434
435
436    //
437    // Overridden methods from DAO
438    //
439    /**
440     * @see DAO::updateDataObjectSettings()
441     */
442    public function updateDataObjectSettings(string $tableName, DataObject $dataObject, array $idArray): void
443    {
444        // Make sure that the update function finds the filter settings
445        $this->additionalFieldNames = $dataObject->getSettingNames();
446        $this->localeFieldNames = $dataObject->getLocalizedSettingNames();
447
448        // Add runtime settings
449        foreach ($dataObject->supportedRuntimeEnvironmentSettings() as $runtimeSetting => $defaultValue) {
450            if ($dataObject->hasData($runtimeSetting)) {
451                $this->additionalFieldNames[] = $runtimeSetting;
452            }
453        }
454
455        // Update the filter settings
456        parent::updateDataObjectSettings($tableName, $dataObject, $idArray);
457
458        // Reset the internal fields
459        unset($this->additionalFieldNames, $this->localeFieldNames);
460    }
461
462
463    //
464    // Implement template methods from DAO
465    //
466    /**
467     * @see DAO::getAdditionalFieldNames()
468     */
469    public function getAdditionalFieldNames(): array
470    {
471        return $this->additionalFieldNames;
472    }
473
474    /**
475     * @see DAO::getLocaleFieldNames()
476     */
477    public function getLocaleFieldNames(): array
478    {
479        return $this->localeFieldNames;
480    }
481
482
483    //
484    // Private helper methods
485    //
486    /**
487     * Construct a new configured filter instance (transformation).
488     *
489     * @param string $filterClassName a fully qualified class name
490     *
491     */
492    public function _newDataObject(string $filterClassName, int $filterGroupId): PersistableFilter
493    {
494        // Instantiate the filter group.
495        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
496        $filterGroup = $filterGroupDao->getObjectById($filterGroupId);
497        if (!$filterGroup) {
498            throw new Exception('Could not get filter group by ID!');
499        }
500
501        // Instantiate the filter
502        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
503            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
504            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
505        } elseif (class_exists($filterClassName)) {
506            $filter = new $filterClassName($filterGroup);
507        }
508        if (!is_object($filter)) {
509            throw new Exception('Error while instantiating class "' . $filterClassName . '" as filter!');
510        }
511
512        return $filter;
513    }
514
515    /**
516     * Internal function to return a filter instance (transformation)
517     * object from a row.
518     */
519    public function _fromRow(array $row): PersistableFilter
520    {
521        static $lockedFilters = [];
522        $filterId = $row['filter_id'];
523
524        // Check the filter lock (to detect loops).
525        // NB: This is very important otherwise the request
526        // could eat up lots of memory if the PHP memory max was
527        // set too high.
528        if (isset($lockedFilters[$filterId])) {
529            throw new Exception('Detected a loop in the definition of the filter with id ' . $filterId . '!');
530        }
531
532        // Lock the filter id.
533        $lockedFilters[$filterId] = true;
534
535        // Instantiate the filter.
536        $filter = $this->_newDataObject($row['class_name'], (int)$row['filter_group_id']);
537
538        // Configure the filter instance
539        $filter->setId((int)$row['filter_id']);
540        $filter->setDisplayName($row['display_name']);
541        $filter->setIsTemplate((bool)$row['is_template']);
542        $filter->setParentFilterId($row['parent_filter_id']);
543        $filter->setSequence((int)$row['seq']);
544        $this->getDataObjectSettings('filter_settings', 'filter_id', $row['filter_id'], $filter);
545
546        // Recursively retrieve sub-filters of this filter.
547        $this->_populateSubFilters($filter);
548
549        // Release the lock on the filter id.
550        unset($lockedFilters[$filterId]);
551
552        return $filter;
553    }
554
555    /**
556     * Populate the sub-filters (if any) for the
557     * given parent filter.
558     */
559    public function _populateSubFilters(PersistableFilter $parentFilter): void
560    {
561        if (!$parentFilter instanceof \PKP\filter\CompositeFilter) {
562            // Nothing to do. Only composite filters
563            // can have sub-filters.
564            return;
565        }
566
567        // Retrieve the sub-filters from the database.
568        $result = $this->retrieve(
569            'SELECT * FROM filters WHERE parent_filter_id = ? ORDER BY seq',
570            [$parentFilter->getId()]
571        );
572        /** @var DAOResultFactory<PersistableFilter> */
573        $daoResultFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
574
575        // Add sub-filters.
576        while ($subFilter = $daoResultFactory->next()) {
577            // Add the sub-filter to the filter list
578            // of its parent filter.
579            $parentFilter->addFilter($subFilter);
580        }
581    }
582
583    /**
584     * Recursively insert sub-filters of
585     * the given parent filter.
586     */
587    public function _insertSubFilters(Filter $parentFilter): void
588    {
589        if (!$parentFilter instanceof \PKP\filter\CompositeFilter) {
590            // Nothing to do. Only composite filters
591            // can have sub-filters.
592            return;
593        }
594
595        // Recursively insert sub-filters
596        foreach ($parentFilter->getFilters() as $subFilter) {
597            $subFilter->setParentFilterId($parentFilter->getId());
598            $subfilterId = $this->insertObject($subFilter);
599        }
600    }
601
602    /**
603     * Recursively delete all sub-filters for the given parent filter.
604     */
605    public function _deleteSubFiltersByParentFilterId(int $parentFilterId): void
606    {
607        // Identify sub-filters.
608        $result = $this->retrieve(
609            'SELECT * FROM filters WHERE parent_filter_id = ?',
610            [$parentFilterId]
611        );
612
613        foreach ($result as $row) {
614            // Delete sub-filters
615            // NB: We need to do this before we delete
616            // sub-sub-filters to avoid loops.
617            $subFilterId = $row->filter_id;
618            $this->deleteObjectById($subFilterId);
619
620            // Recursively delete sub-sub-filters.
621            $this->_deleteSubFiltersByParentFilterId($subFilterId);
622        }
623    }
624}
625
626if (!PKP_STRICT_MODE) {
627    class_alias('\PKP\filter\FilterDAO', '\FilterDAO');
628}

Paths

Below are the source code lines that represent each code path as identified by Xdebug. Please note a path is not necessarily coterminous with a line, a line may contain multiple paths and therefore show up more than once. Please also be aware that some paths may include implicit rather than explicit branches, e.g. an if statement always has an else as part of its logical flow even if you didn't write one.

FilterDAO->_deleteSubFiltersByParentFilterId
605    public function _deleteSubFiltersByParentFilterId(int $parentFilterId): void
606    {
607        // Identify sub-filters.
608        $result = $this->retrieve(
609            'SELECT * FROM filters WHERE parent_filter_id = ?',
610            [$parentFilterId]
611        );
612
613        foreach ($result as $row) {
 
613        foreach ($result as $row) {
 
613        foreach ($result as $row) {
614            // Delete sub-filters
615            // NB: We need to do this before we delete
616            // sub-sub-filters to avoid loops.
617            $subFilterId = $row->filter_id;
 
613        foreach ($result as $row) {
 
613        foreach ($result as $row) {
614            // Delete sub-filters
615            // NB: We need to do this before we delete
616            // sub-sub-filters to avoid loops.
617            $subFilterId = $row->filter_id;
618            $this->deleteObjectById($subFilterId);
619
620            // Recursively delete sub-sub-filters.
621            $this->_deleteSubFiltersByParentFilterId($subFilterId);
622        }
623    }
605    public function _deleteSubFiltersByParentFilterId(int $parentFilterId): void
606    {
607        // Identify sub-filters.
608        $result = $this->retrieve(
609            'SELECT * FROM filters WHERE parent_filter_id = ?',
610            [$parentFilterId]
611        );
612
613        foreach ($result as $row) {
 
613        foreach ($result as $row) {
 
613        foreach ($result as $row) {
614            // Delete sub-filters
615            // NB: We need to do this before we delete
616            // sub-sub-filters to avoid loops.
617            $subFilterId = $row->filter_id;
618            $this->deleteObjectById($subFilterId);
619
620            // Recursively delete sub-sub-filters.
621            $this->_deleteSubFiltersByParentFilterId($subFilterId);
622        }
623    }
605    public function _deleteSubFiltersByParentFilterId(int $parentFilterId): void
606    {
607        // Identify sub-filters.
608        $result = $this->retrieve(
609            'SELECT * FROM filters WHERE parent_filter_id = ?',
610            [$parentFilterId]
611        );
612
613        foreach ($result as $row) {
 
613        foreach ($result as $row) {
614            // Delete sub-filters
615            // NB: We need to do this before we delete
616            // sub-sub-filters to avoid loops.
617            $subFilterId = $row->filter_id;
618            $this->deleteObjectById($subFilterId);
619
620            // Recursively delete sub-sub-filters.
621            $this->_deleteSubFiltersByParentFilterId($subFilterId);
622        }
623    }
FilterDAO->_fromRow
519    public function _fromRow(array $row): PersistableFilter
520    {
521        static $lockedFilters = [];
522        $filterId = $row['filter_id'];
523
524        // Check the filter lock (to detect loops).
525        // NB: This is very important otherwise the request
526        // could eat up lots of memory if the PHP memory max was
527        // set too high.
528        if (isset($lockedFilters[$filterId])) {
 
529            throw new Exception('Detected a loop in the definition of the filter with id ' . $filterId . '!');
519    public function _fromRow(array $row): PersistableFilter
520    {
521        static $lockedFilters = [];
522        $filterId = $row['filter_id'];
523
524        // Check the filter lock (to detect loops).
525        // NB: This is very important otherwise the request
526        // could eat up lots of memory if the PHP memory max was
527        // set too high.
528        if (isset($lockedFilters[$filterId])) {
 
533        $lockedFilters[$filterId] = true;
534
535        // Instantiate the filter.
536        $filter = $this->_newDataObject($row['class_name'], (int)$row['filter_group_id']);
537
538        // Configure the filter instance
539        $filter->setId((int)$row['filter_id']);
540        $filter->setDisplayName($row['display_name']);
541        $filter->setIsTemplate((bool)$row['is_template']);
542        $filter->setParentFilterId($row['parent_filter_id']);
543        $filter->setSequence((int)$row['seq']);
544        $this->getDataObjectSettings('filter_settings', 'filter_id', $row['filter_id'], $filter);
545
546        // Recursively retrieve sub-filters of this filter.
547        $this->_populateSubFilters($filter);
548
549        // Release the lock on the filter id.
550        unset($lockedFilters[$filterId]);
551
552        return $filter;
553    }
FilterDAO->_insertSubFilters
587    public function _insertSubFilters(Filter $parentFilter): void
588    {
589        if (!$parentFilter instanceof \PKP\filter\CompositeFilter) {
 
592            return;
587    public function _insertSubFilters(Filter $parentFilter): void
588    {
589        if (!$parentFilter instanceof \PKP\filter\CompositeFilter) {
 
596        foreach ($parentFilter->getFilters() as $subFilter) {
 
596        foreach ($parentFilter->getFilters() as $subFilter) {
 
596        foreach ($parentFilter->getFilters() as $subFilter) {
597            $subFilter->setParentFilterId($parentFilter->getId());
 
596        foreach ($parentFilter->getFilters() as $subFilter) {
 
596        foreach ($parentFilter->getFilters() as $subFilter) {
597            $subFilter->setParentFilterId($parentFilter->getId());
598            $subfilterId = $this->insertObject($subFilter);
599        }
600    }
587    public function _insertSubFilters(Filter $parentFilter): void
588    {
589        if (!$parentFilter instanceof \PKP\filter\CompositeFilter) {
 
596        foreach ($parentFilter->getFilters() as $subFilter) {
 
596        foreach ($parentFilter->getFilters() as $subFilter) {
 
596        foreach ($parentFilter->getFilters() as $subFilter) {
597            $subFilter->setParentFilterId($parentFilter->getId());
598            $subfilterId = $this->insertObject($subFilter);
599        }
600    }
587    public function _insertSubFilters(Filter $parentFilter): void
588    {
589        if (!$parentFilter instanceof \PKP\filter\CompositeFilter) {
 
596        foreach ($parentFilter->getFilters() as $subFilter) {
 
596        foreach ($parentFilter->getFilters() as $subFilter) {
597            $subFilter->setParentFilterId($parentFilter->getId());
598            $subfilterId = $this->insertObject($subFilter);
599        }
600    }
FilterDAO->_newDataObject
492    public function _newDataObject(string $filterClassName, int $filterGroupId): PersistableFilter
493    {
494        // Instantiate the filter group.
495        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
496        $filterGroup = $filterGroupDao->getObjectById($filterGroupId);
497        if (!$filterGroup) {
 
498            throw new Exception('Could not get filter group by ID!');
492    public function _newDataObject(string $filterClassName, int $filterGroupId): PersistableFilter
493    {
494        // Instantiate the filter group.
495        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
496        $filterGroup = $filterGroupDao->getObjectById($filterGroupId);
497        if (!$filterGroup) {
 
502        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
502        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
503            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
504            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
508        if (!is_object($filter)) {
 
509            throw new Exception('Error while instantiating class "' . $filterClassName . '" as filter!');
492    public function _newDataObject(string $filterClassName, int $filterGroupId): PersistableFilter
493    {
494        // Instantiate the filter group.
495        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
496        $filterGroup = $filterGroupDao->getObjectById($filterGroupId);
497        if (!$filterGroup) {
 
502        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
502        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
503            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
504            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
508        if (!is_object($filter)) {
 
512        return $filter;
513    }
492    public function _newDataObject(string $filterClassName, int $filterGroupId): PersistableFilter
493    {
494        // Instantiate the filter group.
495        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
496        $filterGroup = $filterGroupDao->getObjectById($filterGroupId);
497        if (!$filterGroup) {
 
502        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
505        } elseif (class_exists($filterClassName)) {
 
506            $filter = new $filterClassName($filterGroup);
507        }
508        if (!is_object($filter)) {
 
508        if (!is_object($filter)) {
 
509            throw new Exception('Error while instantiating class "' . $filterClassName . '" as filter!');
492    public function _newDataObject(string $filterClassName, int $filterGroupId): PersistableFilter
493    {
494        // Instantiate the filter group.
495        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
496        $filterGroup = $filterGroupDao->getObjectById($filterGroupId);
497        if (!$filterGroup) {
 
502        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
505        } elseif (class_exists($filterClassName)) {
 
506            $filter = new $filterClassName($filterGroup);
507        }
508        if (!is_object($filter)) {
 
508        if (!is_object($filter)) {
 
512        return $filter;
513    }
492    public function _newDataObject(string $filterClassName, int $filterGroupId): PersistableFilter
493    {
494        // Instantiate the filter group.
495        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
496        $filterGroup = $filterGroupDao->getObjectById($filterGroupId);
497        if (!$filterGroup) {
 
502        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
505        } elseif (class_exists($filterClassName)) {
 
508        if (!is_object($filter)) {
 
509            throw new Exception('Error while instantiating class "' . $filterClassName . '" as filter!');
492    public function _newDataObject(string $filterClassName, int $filterGroupId): PersistableFilter
493    {
494        // Instantiate the filter group.
495        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
496        $filterGroup = $filterGroupDao->getObjectById($filterGroupId);
497        if (!$filterGroup) {
 
502        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
505        } elseif (class_exists($filterClassName)) {
 
508        if (!is_object($filter)) {
 
512        return $filter;
513    }
FilterDAO->_populateSubFilters
559    public function _populateSubFilters(PersistableFilter $parentFilter): void
560    {
561        if (!$parentFilter instanceof \PKP\filter\CompositeFilter) {
 
564            return;
559    public function _populateSubFilters(PersistableFilter $parentFilter): void
560    {
561        if (!$parentFilter instanceof \PKP\filter\CompositeFilter) {
 
568        $result = $this->retrieve(
569            'SELECT * FROM filters WHERE parent_filter_id = ? ORDER BY seq',
570            [$parentFilter->getId()]
571        );
572        /** @var DAOResultFactory<PersistableFilter> */
573        $daoResultFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
574
575        // Add sub-filters.
576        while ($subFilter = $daoResultFactory->next()) {
 
576        while ($subFilter = $daoResultFactory->next()) {
 
581    }
559    public function _populateSubFilters(PersistableFilter $parentFilter): void
560    {
561        if (!$parentFilter instanceof \PKP\filter\CompositeFilter) {
 
568        $result = $this->retrieve(
569            'SELECT * FROM filters WHERE parent_filter_id = ? ORDER BY seq',
570            [$parentFilter->getId()]
571        );
572        /** @var DAOResultFactory<PersistableFilter> */
573        $daoResultFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
574
575        // Add sub-filters.
576        while ($subFilter = $daoResultFactory->next()) {
 
576        while ($subFilter = $daoResultFactory->next()) {
 
576        while ($subFilter = $daoResultFactory->next()) {
577            // Add the sub-filter to the filter list
578            // of its parent filter.
579            $parentFilter->addFilter($subFilter);
 
576        while ($subFilter = $daoResultFactory->next()) {
 
581    }
FilterDAO->configureObject
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
86            return false;
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
100            return false;
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
109                throw new Exception('Filter is not expected type CompositeFilter!');
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
112                throw new Exception('Subfilters must be an array!');
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
129                return false;
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
129                return false;
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
129                return false;
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
129                return false;
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
129                return false;
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
129                return false;
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
129                return false;
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
129                return false;
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
129                return false;
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
129                return false;
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
129                return false;
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
129                return false;
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
91            // DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
92            $filter = instantiate($filterClassName, 'PersistableFilter', null, 'execute', $filterGroup); /** @var PersistableFilter $filter */
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
100            return false;
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
109                throw new Exception('Filter is not expected type CompositeFilter!');
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
112                throw new Exception('Subfilters must be an array!');
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
129                return false;
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
129                return false;
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
129                return false;
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
129                return false;
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
129                return false;
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
129                return false;
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
129                return false;
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
129                return false;
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
129                return false;
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
108            if (!$filter instanceof \PKP\filter\CompositeFilter) {
 
111            if (!is_array($subFilters)) {
 
114            foreach ($subFilters as $subFilter) {
 
114            foreach ($subFilters as $subFilter) {
115                $filter->addFilter($subFilter);
116            }
117        }
118
119        // Parameterize the filter.
120        assert(is_array($settings));
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
129                return false;
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
129                return false;
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
129                return false;
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
127            $filterId = $this->insertObject($filter, $contextId);
128            if (!$filterId) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
94            $filter = new $filterClassName($filterGroup);
 
99        if (!$filter) {
 
104        $filter->setIsTemplate((bool)$asTemplate);
105
106        // Add sub-filters (if any).
107        if (!empty($subFilters)) {
 
120        assert(is_array($settings));
121        foreach ($settings as $key => $value) {
 
121        foreach ($settings as $key => $value) {
122            $filter->setData($key, $value);
123        }
124
125        // Persist the filter.
126        if ($persist) {
 
133        return $filter;
134    }
73    public function configureObject(
74        string $filterClassName,
75        string $filterGroupSymbolic,
76        array $settings = [],
77        bool $asTemplate = false,
78        ?int $contextId = Application::SITE_CONTEXT_ID,
79        array $subFilters = [],
80        bool $persist = true
81    ): bool|PersistableFilter {
82        // Retrieve the filter group from the database.
83        $filterGroupDao = DAORegistry::getDAO('FilterGroupDAO'); /** @var FilterGroupDAO $filterGroupDao */
84        $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
85        if (!$filterGroup instanceof \PKP\filter\FilterGroup) {
 
90        if (preg_match('/^[a-zA-Z0-9_.]+$/', $filterClassName)) {
 
93        } elseif (class_exists($filterClassName)) {
 
97            return false;
FilterDAO->deleteObject
419    public function deleteObject(PersistableFilter $filter): bool
420    {
421        return $this->deleteObjectById($filter->getId());
422    }
FilterDAO->deleteObjectById
427    public function deleteObjectById(int $filterId): bool
428    {
429        $this->update('DELETE FROM filters WHERE filter_id = ?', [$filterId]);
430        $this->update('DELETE FROM filter_settings WHERE filter_id = ?', [$filterId]);
431        $this->_deleteSubFiltersByParentFilterId($filterId);
432        return true;
433    }
FilterDAO->getAdditionalFieldNames
471        return $this->additionalFieldNames;
472    }
FilterDAO->getLocaleFieldNames
479        return $this->localeFieldNames;
480    }
FilterDAO->getObject
178    public function getObject(PersistableFilter $filter): PersistableFilter
179    {
180        return $this->getObjectById($filter->getId());
181    }
FilterDAO->getObjectById
186    public function getObjectById(int $filterId, bool $allowSubfilter = false): ?PersistableFilter
187    {
188        $result = $this->retrieve(
189            'SELECT * FROM filters
190            WHERE ' . ($allowSubfilter ? '' : 'parent_filter_id IS NULL AND ') . '
 
190            WHERE ' . ($allowSubfilter ? '' : 'parent_filter_id IS NULL AND ') . '
 
190            WHERE ' . ($allowSubfilter ? '' : 'parent_filter_id IS NULL AND ') . '
191            filter_id = ?',
192            [(int) $filterId]
193        );
194        $row = $result->current();
195        return $row ? $this->_fromRow((array) $row) : null;
 
195        return $row ? $this->_fromRow((array) $row) : null;
 
195        return $row ? $this->_fromRow((array) $row) : null;
196    }
186    public function getObjectById(int $filterId, bool $allowSubfilter = false): ?PersistableFilter
187    {
188        $result = $this->retrieve(
189            'SELECT * FROM filters
190            WHERE ' . ($allowSubfilter ? '' : 'parent_filter_id IS NULL AND ') . '
 
190            WHERE ' . ($allowSubfilter ? '' : 'parent_filter_id IS NULL AND ') . '
 
190            WHERE ' . ($allowSubfilter ? '' : 'parent_filter_id IS NULL AND ') . '
191            filter_id = ?',
192            [(int) $filterId]
193        );
194        $row = $result->current();
195        return $row ? $this->_fromRow((array) $row) : null;
 
195        return $row ? $this->_fromRow((array) $row) : null;
 
195        return $row ? $this->_fromRow((array) $row) : null;
196    }
186    public function getObjectById(int $filterId, bool $allowSubfilter = false): ?PersistableFilter
187    {
188        $result = $this->retrieve(
189            'SELECT * FROM filters
190            WHERE ' . ($allowSubfilter ? '' : 'parent_filter_id IS NULL AND ') . '
 
190            WHERE ' . ($allowSubfilter ? '' : 'parent_filter_id IS NULL AND ') . '
 
190            WHERE ' . ($allowSubfilter ? '' : 'parent_filter_id IS NULL AND ') . '
191            filter_id = ?',
192            [(int) $filterId]
193        );
194        $row = $result->current();
195        return $row ? $this->_fromRow((array) $row) : null;
 
195        return $row ? $this->_fromRow((array) $row) : null;
 
195        return $row ? $this->_fromRow((array) $row) : null;
196    }
186    public function getObjectById(int $filterId, bool $allowSubfilter = false): ?PersistableFilter
187    {
188        $result = $this->retrieve(
189            'SELECT * FROM filters
190            WHERE ' . ($allowSubfilter ? '' : 'parent_filter_id IS NULL AND ') . '
 
190            WHERE ' . ($allowSubfilter ? '' : 'parent_filter_id IS NULL AND ') . '
 
190            WHERE ' . ($allowSubfilter ? '' : 'parent_filter_id IS NULL AND ') . '
191            filter_id = ?',
192            [(int) $filterId]
193        );
194        $row = $result->current();
195        return $row ? $this->_fromRow((array) $row) : null;
 
195        return $row ? $this->_fromRow((array) $row) : null;
 
195        return $row ? $this->_fromRow((array) $row) : null;
196    }
FilterDAO->getObjectsByClass
207    public function getObjectsByClass(
208        string $className,
209        ?int $contextId = Application::SITE_CONTEXT_ID,
210        bool $getTemplates = false,
211        bool $allowSubfilters = false
212    ): DAOResultFactory {
213        $result = $this->retrieve(
214            'SELECT * FROM filters
215                WHERE COALESCE(context_id, 0) = ? AND
216                LOWER(class_name) = LOWER(?) AND
217            ' . ($allowSubfilters ? '' : ' parent_filter_id IS NULL AND ') . '
 
217            ' . ($allowSubfilters ? '' : ' parent_filter_id IS NULL AND ') . '
 
217            ' . ($allowSubfilters ? '' : ' parent_filter_id IS NULL AND ') . '
218            ' . ($getTemplates ? ' is_template = 1' : ' is_template = 0'),
 
218            ' . ($getTemplates ? ' is_template = 1' : ' is_template = 0'),
 
218            ' . ($getTemplates ? ' is_template = 1' : ' is_template = 0'),
219            [(int) $contextId, $className]
220        );
221
222        return new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
223    }
207    public function getObjectsByClass(
208        string $className,
209        ?int $contextId = Application::SITE_CONTEXT_ID,
210        bool $getTemplates = false,
211        bool $allowSubfilters = false
212    ): DAOResultFactory {
213        $result = $this->retrieve(
214            'SELECT * FROM filters
215                WHERE COALESCE(context_id, 0) = ? AND
216                LOWER(class_name) = LOWER(?) AND
217            ' . ($allowSubfilters ? '' : ' parent_filter_id IS NULL AND ') . '
 
217            ' . ($allowSubfilters ? '' : ' parent_filter_id IS NULL AND ') . '
 
217            ' . ($allowSubfilters ? '' : ' parent_filter_id IS NULL AND ') . '
218            ' . ($getTemplates ? ' is_template = 1' : ' is_template = 0'),
 
218            ' . ($getTemplates ? ' is_template = 1' : ' is_template = 0'),
 
218            ' . ($getTemplates ? ' is_template = 1' : ' is_template = 0'),
219            [(int) $contextId, $className]
220        );
221
222        return new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
223    }
207    public function getObjectsByClass(
208        string $className,
209        ?int $contextId = Application::SITE_CONTEXT_ID,
210        bool $getTemplates = false,
211        bool $allowSubfilters = false
212    ): DAOResultFactory {
213        $result = $this->retrieve(
214            'SELECT * FROM filters
215                WHERE COALESCE(context_id, 0) = ? AND
216                LOWER(class_name) = LOWER(?) AND
217            ' . ($allowSubfilters ? '' : ' parent_filter_id IS NULL AND ') . '
 
217            ' . ($allowSubfilters ? '' : ' parent_filter_id IS NULL AND ') . '
 
217            ' . ($allowSubfilters ? '' : ' parent_filter_id IS NULL AND ') . '
218            ' . ($getTemplates ? ' is_template = 1' : ' is_template = 0'),
 
218            ' . ($getTemplates ? ' is_template = 1' : ' is_template = 0'),
 
218            ' . ($getTemplates ? ' is_template = 1' : ' is_template = 0'),
219            [(int) $contextId, $className]
220        );
221
222        return new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
223    }
207    public function getObjectsByClass(
208        string $className,
209        ?int $contextId = Application::SITE_CONTEXT_ID,
210        bool $getTemplates = false,
211        bool $allowSubfilters = false
212    ): DAOResultFactory {
213        $result = $this->retrieve(
214            'SELECT * FROM filters
215                WHERE COALESCE(context_id, 0) = ? AND
216                LOWER(class_name) = LOWER(?) AND
217            ' . ($allowSubfilters ? '' : ' parent_filter_id IS NULL AND ') . '
 
217            ' . ($allowSubfilters ? '' : ' parent_filter_id IS NULL AND ') . '
 
217            ' . ($allowSubfilters ? '' : ' parent_filter_id IS NULL AND ') . '
218            ' . ($getTemplates ? ' is_template = 1' : ' is_template = 0'),
 
218            ' . ($getTemplates ? ' is_template = 1' : ' is_template = 0'),
 
218            ' . ($getTemplates ? ' is_template = 1' : ' is_template = 0'),
219            [(int) $contextId, $className]
220        );
221
222        return new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
223    }
FilterDAO->getObjectsByGroup
342    public function getObjectsByGroup(
343        string $groupSymbolic,
344        ?int $contextId = Application::SITE_CONTEXT_ID_ALL,
345        bool $getTemplates = false,
346        bool $checkRuntimeEnvironment = true
347    ): array {
348        // 1) Get all available transformations in the group.
349        $result = $this->retrieve(
350            'SELECT f.* FROM filters f' .
351            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
354            '  AND f.parent_filter_id IS NULL',
355            [$groupSymbolic]
356        );
357
358
359        // 2) Instantiate and return all transformations in the
360        //    result set that comply with the current runtime
361        //    environment.
362        $matchingFilters = [];
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
367            }
368        }
369
370        return $matchingFilters;
371    }
342    public function getObjectsByGroup(
343        string $groupSymbolic,
344        ?int $contextId = Application::SITE_CONTEXT_ID_ALL,
345        bool $getTemplates = false,
346        bool $checkRuntimeEnvironment = true
347    ): array {
348        // 1) Get all available transformations in the group.
349        $result = $this->retrieve(
350            'SELECT f.* FROM filters f' .
351            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
354            '  AND f.parent_filter_id IS NULL',
355            [$groupSymbolic]
356        );
357
358
359        // 2) Instantiate and return all transformations in the
360        //    result set that comply with the current runtime
361        //    environment.
362        $matchingFilters = [];
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
367            }
368        }
369
370        return $matchingFilters;
371    }
342    public function getObjectsByGroup(
343        string $groupSymbolic,
344        ?int $contextId = Application::SITE_CONTEXT_ID_ALL,
345        bool $getTemplates = false,
346        bool $checkRuntimeEnvironment = true
347    ): array {
348        // 1) Get all available transformations in the group.
349        $result = $this->retrieve(
350            'SELECT f.* FROM filters f' .
351            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
354            '  AND f.parent_filter_id IS NULL',
355            [$groupSymbolic]
356        );
357
358
359        // 2) Instantiate and return all transformations in the
360        //    result set that comply with the current runtime
361        //    environment.
362        $matchingFilters = [];
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
367            }
368        }
369
370        return $matchingFilters;
371    }
342    public function getObjectsByGroup(
343        string $groupSymbolic,
344        ?int $contextId = Application::SITE_CONTEXT_ID_ALL,
345        bool $getTemplates = false,
346        bool $checkRuntimeEnvironment = true
347    ): array {
348        // 1) Get all available transformations in the group.
349        $result = $this->retrieve(
350            'SELECT f.* FROM filters f' .
351            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
354            '  AND f.parent_filter_id IS NULL',
355            [$groupSymbolic]
356        );
357
358
359        // 2) Instantiate and return all transformations in the
360        //    result set that comply with the current runtime
361        //    environment.
362        $matchingFilters = [];
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
367            }
368        }
369
370        return $matchingFilters;
371    }
342    public function getObjectsByGroup(
343        string $groupSymbolic,
344        ?int $contextId = Application::SITE_CONTEXT_ID_ALL,
345        bool $getTemplates = false,
346        bool $checkRuntimeEnvironment = true
347    ): array {
348        // 1) Get all available transformations in the group.
349        $result = $this->retrieve(
350            'SELECT f.* FROM filters f' .
351            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
354            '  AND f.parent_filter_id IS NULL',
355            [$groupSymbolic]
356        );
357
358
359        // 2) Instantiate and return all transformations in the
360        //    result set that comply with the current runtime
361        //    environment.
362        $matchingFilters = [];
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
367            }
368        }
369
370        return $matchingFilters;
371    }
342    public function getObjectsByGroup(
343        string $groupSymbolic,
344        ?int $contextId = Application::SITE_CONTEXT_ID_ALL,
345        bool $getTemplates = false,
346        bool $checkRuntimeEnvironment = true
347    ): array {
348        // 1) Get all available transformations in the group.
349        $result = $this->retrieve(
350            'SELECT f.* FROM filters f' .
351            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
354            '  AND f.parent_filter_id IS NULL',
355            [$groupSymbolic]
356        );
357
358
359        // 2) Instantiate and return all transformations in the
360        //    result set that comply with the current runtime
361        //    environment.
362        $matchingFilters = [];
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
367            }
368        }
369
370        return $matchingFilters;
371    }
342    public function getObjectsByGroup(
343        string $groupSymbolic,
344        ?int $contextId = Application::SITE_CONTEXT_ID_ALL,
345        bool $getTemplates = false,
346        bool $checkRuntimeEnvironment = true
347    ): array {
348        // 1) Get all available transformations in the group.
349        $result = $this->retrieve(
350            'SELECT f.* FROM filters f' .
351            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
354            '  AND f.parent_filter_id IS NULL',
355            [$groupSymbolic]
356        );
357
358
359        // 2) Instantiate and return all transformations in the
360        //    result set that comply with the current runtime
361        //    environment.
362        $matchingFilters = [];
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
367            }
368        }
369
370        return $matchingFilters;
371    }
342    public function getObjectsByGroup(
343        string $groupSymbolic,
344        ?int $contextId = Application::SITE_CONTEXT_ID_ALL,
345        bool $getTemplates = false,
346        bool $checkRuntimeEnvironment = true
347    ): array {
348        // 1) Get all available transformations in the group.
349        $result = $this->retrieve(
350            'SELECT f.* FROM filters f' .
351            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
354            '  AND f.parent_filter_id IS NULL',
355            [$groupSymbolic]
356        );
357
358
359        // 2) Instantiate and return all transformations in the
360        //    result set that comply with the current runtime
361        //    environment.
362        $matchingFilters = [];
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
367            }
368        }
369
370        return $matchingFilters;
371    }
342    public function getObjectsByGroup(
343        string $groupSymbolic,
344        ?int $contextId = Application::SITE_CONTEXT_ID_ALL,
345        bool $getTemplates = false,
346        bool $checkRuntimeEnvironment = true
347    ): array {
348        // 1) Get all available transformations in the group.
349        $result = $this->retrieve(
350            'SELECT f.* FROM filters f' .
351            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
354            '  AND f.parent_filter_id IS NULL',
355            [$groupSymbolic]
356        );
357
358
359        // 2) Instantiate and return all transformations in the
360        //    result set that comply with the current runtime
361        //    environment.
362        $matchingFilters = [];
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
367            }
368        }
369
370        return $matchingFilters;
371    }
342    public function getObjectsByGroup(
343        string $groupSymbolic,
344        ?int $contextId = Application::SITE_CONTEXT_ID_ALL,
345        bool $getTemplates = false,
346        bool $checkRuntimeEnvironment = true
347    ): array {
348        // 1) Get all available transformations in the group.
349        $result = $this->retrieve(
350            'SELECT f.* FROM filters f' .
351            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
354            '  AND f.parent_filter_id IS NULL',
355            [$groupSymbolic]
356        );
357
358
359        // 2) Instantiate and return all transformations in the
360        //    result set that comply with the current runtime
361        //    environment.
362        $matchingFilters = [];
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
367            }
368        }
369
370        return $matchingFilters;
371    }
342    public function getObjectsByGroup(
343        string $groupSymbolic,
344        ?int $contextId = Application::SITE_CONTEXT_ID_ALL,
345        bool $getTemplates = false,
346        bool $checkRuntimeEnvironment = true
347    ): array {
348        // 1) Get all available transformations in the group.
349        $result = $this->retrieve(
350            'SELECT f.* FROM filters f' .
351            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
354            '  AND f.parent_filter_id IS NULL',
355            [$groupSymbolic]
356        );
357
358
359        // 2) Instantiate and return all transformations in the
360        //    result set that comply with the current runtime
361        //    environment.
362        $matchingFilters = [];
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
367            }
368        }
369
370        return $matchingFilters;
371    }
342    public function getObjectsByGroup(
343        string $groupSymbolic,
344        ?int $contextId = Application::SITE_CONTEXT_ID_ALL,
345        bool $getTemplates = false,
346        bool $checkRuntimeEnvironment = true
347    ): array {
348        // 1) Get all available transformations in the group.
349        $result = $this->retrieve(
350            'SELECT f.* FROM filters f' .
351            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
354            '  AND f.parent_filter_id IS NULL',
355            [$groupSymbolic]
356        );
357
358
359        // 2) Instantiate and return all transformations in the
360        //    result set that comply with the current runtime
361        //    environment.
362        $matchingFilters = [];
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
367            }
368        }
369
370        return $matchingFilters;
371    }
342    public function getObjectsByGroup(
343        string $groupSymbolic,
344        ?int $contextId = Application::SITE_CONTEXT_ID_ALL,
345        bool $getTemplates = false,
346        bool $checkRuntimeEnvironment = true
347    ): array {
348        // 1) Get all available transformations in the group.
349        $result = $this->retrieve(
350            'SELECT f.* FROM filters f' .
351            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
354            '  AND f.parent_filter_id IS NULL',
355            [$groupSymbolic]
356        );
357
358
359        // 2) Instantiate and return all transformations in the
360        //    result set that comply with the current runtime
361        //    environment.
362        $matchingFilters = [];
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
367            }
368        }
369
370        return $matchingFilters;
371    }
342    public function getObjectsByGroup(
343        string $groupSymbolic,
344        ?int $contextId = Application::SITE_CONTEXT_ID_ALL,
345        bool $getTemplates = false,
346        bool $checkRuntimeEnvironment = true
347    ): array {
348        // 1) Get all available transformations in the group.
349        $result = $this->retrieve(
350            'SELECT f.* FROM filters f' .
351            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
354            '  AND f.parent_filter_id IS NULL',
355            [$groupSymbolic]
356        );
357
358
359        // 2) Instantiate and return all transformations in the
360        //    result set that comply with the current runtime
361        //    environment.
362        $matchingFilters = [];
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
367            }
368        }
369
370        return $matchingFilters;
371    }
342    public function getObjectsByGroup(
343        string $groupSymbolic,
344        ?int $contextId = Application::SITE_CONTEXT_ID_ALL,
345        bool $getTemplates = false,
346        bool $checkRuntimeEnvironment = true
347    ): array {
348        // 1) Get all available transformations in the group.
349        $result = $this->retrieve(
350            'SELECT f.* FROM filters f' .
351            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
354            '  AND f.parent_filter_id IS NULL',
355            [$groupSymbolic]
356        );
357
358
359        // 2) Instantiate and return all transformations in the
360        //    result set that comply with the current runtime
361        //    environment.
362        $matchingFilters = [];
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
367            }
368        }
369
370        return $matchingFilters;
371    }
342    public function getObjectsByGroup(
343        string $groupSymbolic,
344        ?int $contextId = Application::SITE_CONTEXT_ID_ALL,
345        bool $getTemplates = false,
346        bool $checkRuntimeEnvironment = true
347    ): array {
348        // 1) Get all available transformations in the group.
349        $result = $this->retrieve(
350            'SELECT f.* FROM filters f' .
351            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
354            '  AND f.parent_filter_id IS NULL',
355            [$groupSymbolic]
356        );
357
358
359        // 2) Instantiate and return all transformations in the
360        //    result set that comply with the current runtime
361        //    environment.
362        $matchingFilters = [];
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
367            }
368        }
369
370        return $matchingFilters;
371    }
342    public function getObjectsByGroup(
343        string $groupSymbolic,
344        ?int $contextId = Application::SITE_CONTEXT_ID_ALL,
345        bool $getTemplates = false,
346        bool $checkRuntimeEnvironment = true
347    ): array {
348        // 1) Get all available transformations in the group.
349        $result = $this->retrieve(
350            'SELECT f.* FROM filters f' .
351            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
354            '  AND f.parent_filter_id IS NULL',
355            [$groupSymbolic]
356        );
357
358
359        // 2) Instantiate and return all transformations in the
360        //    result set that comply with the current runtime
361        //    environment.
362        $matchingFilters = [];
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
367            }
368        }
369
370        return $matchingFilters;
371    }
342    public function getObjectsByGroup(
343        string $groupSymbolic,
344        ?int $contextId = Application::SITE_CONTEXT_ID_ALL,
345        bool $getTemplates = false,
346        bool $checkRuntimeEnvironment = true
347    ): array {
348        // 1) Get all available transformations in the group.
349        $result = $this->retrieve(
350            'SELECT f.* FROM filters f' .
351            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
354            '  AND f.parent_filter_id IS NULL',
355            [$groupSymbolic]
356        );
357
358
359        // 2) Instantiate and return all transformations in the
360        //    result set that comply with the current runtime
361        //    environment.
362        $matchingFilters = [];
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
367            }
368        }
369
370        return $matchingFilters;
371    }
342    public function getObjectsByGroup(
343        string $groupSymbolic,
344        ?int $contextId = Application::SITE_CONTEXT_ID_ALL,
345        bool $getTemplates = false,
346        bool $checkRuntimeEnvironment = true
347    ): array {
348        // 1) Get all available transformations in the group.
349        $result = $this->retrieve(
350            'SELECT f.* FROM filters f' .
351            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
354            '  AND f.parent_filter_id IS NULL',
355            [$groupSymbolic]
356        );
357
358
359        // 2) Instantiate and return all transformations in the
360        //    result set that comply with the current runtime
361        //    environment.
362        $matchingFilters = [];
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
367            }
368        }
369
370        return $matchingFilters;
371    }
342    public function getObjectsByGroup(
343        string $groupSymbolic,
344        ?int $contextId = Application::SITE_CONTEXT_ID_ALL,
345        bool $getTemplates = false,
346        bool $checkRuntimeEnvironment = true
347    ): array {
348        // 1) Get all available transformations in the group.
349        $result = $this->retrieve(
350            'SELECT f.* FROM filters f' .
351            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
354            '  AND f.parent_filter_id IS NULL',
355            [$groupSymbolic]
356        );
357
358
359        // 2) Instantiate and return all transformations in the
360        //    result set that comply with the current runtime
361        //    environment.
362        $matchingFilters = [];
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
367            }
368        }
369
370        return $matchingFilters;
371    }
342    public function getObjectsByGroup(
343        string $groupSymbolic,
344        ?int $contextId = Application::SITE_CONTEXT_ID_ALL,
345        bool $getTemplates = false,
346        bool $checkRuntimeEnvironment = true
347    ): array {
348        // 1) Get all available transformations in the group.
349        $result = $this->retrieve(
350            'SELECT f.* FROM filters f' .
351            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
354            '  AND f.parent_filter_id IS NULL',
355            [$groupSymbolic]
356        );
357
358
359        // 2) Instantiate and return all transformations in the
360        //    result set that comply with the current runtime
361        //    environment.
362        $matchingFilters = [];
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
367            }
368        }
369
370        return $matchingFilters;
371    }
342    public function getObjectsByGroup(
343        string $groupSymbolic,
344        ?int $contextId = Application::SITE_CONTEXT_ID_ALL,
345        bool $getTemplates = false,
346        bool $checkRuntimeEnvironment = true
347    ): array {
348        // 1) Get all available transformations in the group.
349        $result = $this->retrieve(
350            'SELECT f.* FROM filters f' .
351            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
354            '  AND f.parent_filter_id IS NULL',
355            [$groupSymbolic]
356        );
357
358
359        // 2) Instantiate and return all transformations in the
360        //    result set that comply with the current runtime
361        //    environment.
362        $matchingFilters = [];
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
367            }
368        }
369
370        return $matchingFilters;
371    }
342    public function getObjectsByGroup(
343        string $groupSymbolic,
344        ?int $contextId = Application::SITE_CONTEXT_ID_ALL,
345        bool $getTemplates = false,
346        bool $checkRuntimeEnvironment = true
347    ): array {
348        // 1) Get all available transformations in the group.
349        $result = $this->retrieve(
350            'SELECT f.* FROM filters f' .
351            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
354            '  AND f.parent_filter_id IS NULL',
355            [$groupSymbolic]
356        );
357
358
359        // 2) Instantiate and return all transformations in the
360        //    result set that comply with the current runtime
361        //    environment.
362        $matchingFilters = [];
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
367            }
368        }
369
370        return $matchingFilters;
371    }
342    public function getObjectsByGroup(
343        string $groupSymbolic,
344        ?int $contextId = Application::SITE_CONTEXT_ID_ALL,
345        bool $getTemplates = false,
346        bool $checkRuntimeEnvironment = true
347    ): array {
348        // 1) Get all available transformations in the group.
349        $result = $this->retrieve(
350            'SELECT f.* FROM filters f' .
351            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
 
352            ' WHERE LOWER(fg.symbolic) = LOWER(?) AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0') .
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
 
353            '  ' . ($contextId !== Application::SITE_CONTEXT_ID_ALL ? 'AND COALESCE(f.context_id, 0) IN (0, ' . (int)$contextId . ')' : '') .
354            '  AND f.parent_filter_id IS NULL',
355            [$groupSymbolic]
356        );
357
358
359        // 2) Instantiate and return all transformations in the
360        //    result set that comply with the current runtime
361        //    environment.
362        $matchingFilters = [];
363        foreach ($result as $row) {
 
363        foreach ($result as $row) {
364            $filterInstance = $this->_fromRow((array) $row);
365            if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
366                $matchingFilters[$filterInstance->getId()] = $filterInstance;
367            }
368        }
369
370        return $matchingFilters;
371    }
FilterDAO->getObjectsByGroupAndClass
235    public function getObjectsByGroupAndClass(
236        string $groupSymbolic,
237        string $className,
238        ?int $contextId = Application::SITE_CONTEXT_ID,
239        bool $getTemplates = false,
240        bool $allowSubfilters = false
241    ): DAOResultFactory {
242        $result = $this->retrieve(
243            'SELECT f.* FROM filters f' .
244            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
245            ' WHERE fg.symbolic = ? AND COALESCE(f.context_id, 0) = ? AND LOWER(f.class_name) = LOWER(?)' .
246            ' ' . ($allowSubfilters ? '' : 'AND f.parent_filter_id IS NULL') .
 
246            ' ' . ($allowSubfilters ? '' : 'AND f.parent_filter_id IS NULL') .
 
246            ' ' . ($allowSubfilters ? '' : 'AND f.parent_filter_id IS NULL') .
247            ' AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0'),
 
247            ' AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0'),
 
247            ' AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0'),
248            [$groupSymbolic, (int) $contextId, $className]
249        );
250
251        return new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
252    }
235    public function getObjectsByGroupAndClass(
236        string $groupSymbolic,
237        string $className,
238        ?int $contextId = Application::SITE_CONTEXT_ID,
239        bool $getTemplates = false,
240        bool $allowSubfilters = false
241    ): DAOResultFactory {
242        $result = $this->retrieve(
243            'SELECT f.* FROM filters f' .
244            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
245            ' WHERE fg.symbolic = ? AND COALESCE(f.context_id, 0) = ? AND LOWER(f.class_name) = LOWER(?)' .
246            ' ' . ($allowSubfilters ? '' : 'AND f.parent_filter_id IS NULL') .
 
246            ' ' . ($allowSubfilters ? '' : 'AND f.parent_filter_id IS NULL') .
 
246            ' ' . ($allowSubfilters ? '' : 'AND f.parent_filter_id IS NULL') .
247            ' AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0'),
 
247            ' AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0'),
 
247            ' AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0'),
248            [$groupSymbolic, (int) $contextId, $className]
249        );
250
251        return new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
252    }
235    public function getObjectsByGroupAndClass(
236        string $groupSymbolic,
237        string $className,
238        ?int $contextId = Application::SITE_CONTEXT_ID,
239        bool $getTemplates = false,
240        bool $allowSubfilters = false
241    ): DAOResultFactory {
242        $result = $this->retrieve(
243            'SELECT f.* FROM filters f' .
244            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
245            ' WHERE fg.symbolic = ? AND COALESCE(f.context_id, 0) = ? AND LOWER(f.class_name) = LOWER(?)' .
246            ' ' . ($allowSubfilters ? '' : 'AND f.parent_filter_id IS NULL') .
 
246            ' ' . ($allowSubfilters ? '' : 'AND f.parent_filter_id IS NULL') .
 
246            ' ' . ($allowSubfilters ? '' : 'AND f.parent_filter_id IS NULL') .
247            ' AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0'),
 
247            ' AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0'),
 
247            ' AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0'),
248            [$groupSymbolic, (int) $contextId, $className]
249        );
250
251        return new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
252    }
235    public function getObjectsByGroupAndClass(
236        string $groupSymbolic,
237        string $className,
238        ?int $contextId = Application::SITE_CONTEXT_ID,
239        bool $getTemplates = false,
240        bool $allowSubfilters = false
241    ): DAOResultFactory {
242        $result = $this->retrieve(
243            'SELECT f.* FROM filters f' .
244            ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
245            ' WHERE fg.symbolic = ? AND COALESCE(f.context_id, 0) = ? AND LOWER(f.class_name) = LOWER(?)' .
246            ' ' . ($allowSubfilters ? '' : 'AND f.parent_filter_id IS NULL') .
 
246            ' ' . ($allowSubfilters ? '' : 'AND f.parent_filter_id IS NULL') .
 
246            ' ' . ($allowSubfilters ? '' : 'AND f.parent_filter_id IS NULL') .
247            ' AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0'),
 
247            ' AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0'),
 
247            ' AND ' . ($getTemplates ? 'f.is_template = 1' : 'f.is_template = 0'),
248            [$groupSymbolic, (int) $contextId, $className]
249        );
250
251        return new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
252    }
FilterDAO->getObjectsByTypeDescription
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
301            return $filterCache[$filterCacheKey];
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
 
316                if ($filterDataType->checkType($data)) {
 
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
 
316                if ($filterDataType->checkType($data)) {
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
 
316                if ($filterDataType->checkType($data)) {
 
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
 
316                if ($filterDataType->checkType($data)) {
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
 
316                if ($filterDataType->checkType($data)) {
 
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
 
316                if ($filterDataType->checkType($data)) {
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
 
316                if ($filterDataType->checkType($data)) {
 
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
 
316                if ($filterDataType->checkType($data)) {
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
 
316                if ($filterDataType->checkType($data)) {
 
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
 
316                if ($filterDataType->checkType($data)) {
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
 
316                if ($filterDataType->checkType($data)) {
 
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
 
316                if ($filterDataType->checkType($data)) {
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
 
316                if ($filterDataType->checkType($data)) {
 
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
 
316                if ($filterDataType->checkType($data)) {
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
 
316                if ($filterDataType->checkType($data)) {
 
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
 
316                if ($filterDataType->checkType($data)) {
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
283            $result = $this->retrieve(
284                'SELECT f.*' .
285                ' FROM filters f' .
286                '  INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id' .
287                ' WHERE LOWER(fg.input_type) LIKE LOWER(?)' .
288                '  AND LOWER(fg.output_type) LIKE LOWER(?)' .
289                '  AND f.parent_filter_id IS NULL AND f.is_template = 0',
290                [$inputTypeDescription, $outputTypeDescription]
291            );
292
293            // Instantiate all filters.
294            /** @var DAOResultFactory<PersistableFilter> */
295            $filterFactory = new DAOResultFactory($result, $this, '_fromRow', ['filter_id']);
296            $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
297        }
298
299        // Return all filter candidates if no data is given to check against.
300        if (is_null($data)) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
301            return $filterCache[$filterCacheKey];
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
 
316                if ($filterDataType->checkType($data)) {
 
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
 
316                if ($filterDataType->checkType($data)) {
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
 
316                if ($filterDataType->checkType($data)) {
 
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
 
316                if ($filterDataType->checkType($data)) {
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
 
316                if ($filterDataType->checkType($data)) {
 
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
 
316                if ($filterDataType->checkType($data)) {
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
 
316                if ($filterDataType->checkType($data)) {
 
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
 
316                if ($filterDataType->checkType($data)) {
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
 
316                if ($filterDataType->checkType($data)) {
 
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
 
316                if ($filterDataType->checkType($data)) {
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
 
316                if ($filterDataType->checkType($data)) {
 
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
 
316                if ($filterDataType->checkType($data)) {
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
 
316                if ($filterDataType->checkType($data)) {
 
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
 
316                if ($filterDataType->checkType($data)) {
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
 
316                if ($filterDataType->checkType($data)) {
 
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
 
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
 
316                if ($filterDataType->checkType($data)) {
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
307            $objectFilterCache[$objectFilterCacheKey] = [];
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
 
308            foreach ($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) { /** @var PersistableFilter $filterCandidate */
309                // Check whether the given object can be transformed
310                // with this filter.
311                if ($dataIsInput) {
312                    $filterDataType = $filterCandidate->getInputType();
313                } else {
314                    $filterDataType = $filterCandidate->getOutputType();
315                }
316                if ($filterDataType->checkType($data)) {
317                    $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
318                }
319                unset($filterCandidate);
320            }
321        }
322
323        return $objectFilterCache[$objectFilterCacheKey];
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
267    public function getObjectsByTypeDescription(
268        string $inputTypeDescription,
269        string $outputTypeDescription,
270        $data = null,
271        bool $dataIsInput = true
272    ): array {
273        static $filterCache = [];
274        static $objectFilterCache = [];
275
276        // We do not yet support array data types. Implement when required.
277        assert(!is_array($data));
278
279        // Build the adapter cache.
280        $filterCacheKey = md5($inputTypeDescription . '=>' . $outputTypeDescription);
281        if (!isset($filterCache[$filterCacheKey])) {
 
300        if (is_null($data)) {
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
 
305        $objectFilterCacheKey = md5($filterCacheKey . (is_object($data) ? get_class($data) : "'{$data}'") . ($dataIsInput ? 'in' : 'out'));
306        if (!isset($objectFilterCache[$objectFilterCacheKey])) {
 
323        return $objectFilterCache[$objectFilterCacheKey];
324    }
FilterDAO->insertObject
143    public function insertObject(PersistableFilter $filter, ?int $contextId = Application::SITE_CONTEXT_ID): int
144    {
145        $filterGroup = $filter->getFilterGroup();
146        assert($filterGroup->getSymbolic() != FILTER_GROUP_TEMPORARY_ONLY);
147
148        $this->update(
149            sprintf('INSERT INTO filters
150                (filter_group_id, context_id, display_name, class_name, is_template, parent_filter_id, seq)
151                VALUES (?, ?, ?, ?, ?, ?, ?)'),
152            [
153                $filterGroup->getId(),
154                $contextId,
155                $filter->getDisplayName(),
156                $filter->getClassName(),
157                $filter->getIsTemplate() ? 1 : 0,
 
157                $filter->getIsTemplate() ? 1 : 0,
 
157                $filter->getIsTemplate() ? 1 : 0,
158                $filter->getParentFilterId(),
159                (int) $filter->getSequence()
160            ]
161        );
162        $filter->setId((int)$this->getInsertId());
163        $this->updateDataObjectSettings(
164            'filter_settings',
165            $filter,
166            ['filter_id' => $filter->getId()]
167        );
168
169        // Recursively insert sub-filters.
170        $this->_insertSubFilters($filter);
171
172        return $filter->getId();
173    }
143    public function insertObject(PersistableFilter $filter, ?int $contextId = Application::SITE_CONTEXT_ID): int
144    {
145        $filterGroup = $filter->getFilterGroup();
146        assert($filterGroup->getSymbolic() != FILTER_GROUP_TEMPORARY_ONLY);
147
148        $this->update(
149            sprintf('INSERT INTO filters
150                (filter_group_id, context_id, display_name, class_name, is_template, parent_filter_id, seq)
151                VALUES (?, ?, ?, ?, ?, ?, ?)'),
152            [
153                $filterGroup->getId(),
154                $contextId,
155                $filter->getDisplayName(),
156                $filter->getClassName(),
157                $filter->getIsTemplate() ? 1 : 0,
 
157                $filter->getIsTemplate() ? 1 : 0,
 
157                $filter->getIsTemplate() ? 1 : 0,
158                $filter->getParentFilterId(),
159                (int) $filter->getSequence()
160            ]
161        );
162        $filter->setId((int)$this->getInsertId());
163        $this->updateDataObjectSettings(
164            'filter_settings',
165            $filter,
166            ['filter_id' => $filter->getId()]
167        );
168
169        // Recursively insert sub-filters.
170        $this->_insertSubFilters($filter);
171
172        return $filter->getId();
173    }
FilterDAO->updateDataObjectSettings
442    public function updateDataObjectSettings(string $tableName, DataObject $dataObject, array $idArray): void
443    {
444        // Make sure that the update function finds the filter settings
445        $this->additionalFieldNames = $dataObject->getSettingNames();
446        $this->localeFieldNames = $dataObject->getLocalizedSettingNames();
447
448        // Add runtime settings
449        foreach ($dataObject->supportedRuntimeEnvironmentSettings() as $runtimeSetting => $defaultValue) {
 
449        foreach ($dataObject->supportedRuntimeEnvironmentSettings() as $runtimeSetting => $defaultValue) {
 
449        foreach ($dataObject->supportedRuntimeEnvironmentSettings() as $runtimeSetting => $defaultValue) {
450            if ($dataObject->hasData($runtimeSetting)) {
 
449        foreach ($dataObject->supportedRuntimeEnvironmentSettings() as $runtimeSetting => $defaultValue) {
450            if ($dataObject->hasData($runtimeSetting)) {
451                $this->additionalFieldNames[] = $runtimeSetting;
 
449        foreach ($dataObject->supportedRuntimeEnvironmentSettings() as $runtimeSetting => $defaultValue) {
 
449        foreach ($dataObject->supportedRuntimeEnvironmentSettings() as $runtimeSetting => $defaultValue) {
 
449        foreach ($dataObject->supportedRuntimeEnvironmentSettings() as $runtimeSetting => $defaultValue) {
450            if ($dataObject->hasData($runtimeSetting)) {
451                $this->additionalFieldNames[] = $runtimeSetting;
452            }
453        }
454
455        // Update the filter settings
456        parent::updateDataObjectSettings($tableName, $dataObject, $idArray);
457
458        // Reset the internal fields
459        unset($this->additionalFieldNames, $this->localeFieldNames);
460    }
442    public function updateDataObjectSettings(string $tableName, DataObject $dataObject, array $idArray): void
443    {
444        // Make sure that the update function finds the filter settings
445        $this->additionalFieldNames = $dataObject->getSettingNames();
446        $this->localeFieldNames = $dataObject->getLocalizedSettingNames();
447
448        // Add runtime settings
449        foreach ($dataObject->supportedRuntimeEnvironmentSettings() as $runtimeSetting => $defaultValue) {
 
449        foreach ($dataObject->supportedRuntimeEnvironmentSettings() as $runtimeSetting => $defaultValue) {
 
449        foreach ($dataObject->supportedRuntimeEnvironmentSettings() as $runtimeSetting => $defaultValue) {
450            if ($dataObject->hasData($runtimeSetting)) {
 
449        foreach ($dataObject->supportedRuntimeEnvironmentSettings() as $runtimeSetting => $defaultValue) {
 
449        foreach ($dataObject->supportedRuntimeEnvironmentSettings() as $runtimeSetting => $defaultValue) {
 
449        foreach ($dataObject->supportedRuntimeEnvironmentSettings() as $runtimeSetting => $defaultValue) {
450            if ($dataObject->hasData($runtimeSetting)) {
451                $this->additionalFieldNames[] = $runtimeSetting;
452            }
453        }
454
455        // Update the filter settings
456        parent::updateDataObjectSettings($tableName, $dataObject, $idArray);
457
458        // Reset the internal fields
459        unset($this->additionalFieldNames, $this->localeFieldNames);
460    }
442    public function updateDataObjectSettings(string $tableName, DataObject $dataObject, array $idArray): void
443    {
444        // Make sure that the update function finds the filter settings
445        $this->additionalFieldNames = $dataObject->getSettingNames();
446        $this->localeFieldNames = $dataObject->getLocalizedSettingNames();
447
448        // Add runtime settings
449        foreach ($dataObject->supportedRuntimeEnvironmentSettings() as $runtimeSetting => $defaultValue) {
 
449        foreach ($dataObject->supportedRuntimeEnvironmentSettings() as $runtimeSetting => $defaultValue) {
 
449        foreach ($dataObject->supportedRuntimeEnvironmentSettings() as $runtimeSetting => $defaultValue) {
450            if ($dataObject->hasData($runtimeSetting)) {
451                $this->additionalFieldNames[] = $runtimeSetting;
452            }
453        }
454
455        // Update the filter settings
456        parent::updateDataObjectSettings($tableName, $dataObject, $idArray);
457
458        // Reset the internal fields
459        unset($this->additionalFieldNames, $this->localeFieldNames);
460    }
442    public function updateDataObjectSettings(string $tableName, DataObject $dataObject, array $idArray): void
443    {
444        // Make sure that the update function finds the filter settings
445        $this->additionalFieldNames = $dataObject->getSettingNames();
446        $this->localeFieldNames = $dataObject->getLocalizedSettingNames();
447
448        // Add runtime settings
449        foreach ($dataObject->supportedRuntimeEnvironmentSettings() as $runtimeSetting => $defaultValue) {
 
449        foreach ($dataObject->supportedRuntimeEnvironmentSettings() as $runtimeSetting => $defaultValue) {
450            if ($dataObject->hasData($runtimeSetting)) {
451                $this->additionalFieldNames[] = $runtimeSetting;
452            }
453        }
454
455        // Update the filter settings
456        parent::updateDataObjectSettings($tableName, $dataObject, $idArray);
457
458        // Reset the internal fields
459        unset($this->additionalFieldNames, $this->localeFieldNames);
460    }
FilterDAO->updateObject
376    public function updateObject(PersistableFilter $filter): void
377    {
378        $filterGroup = $filter->getFilterGroup();
379        assert($filterGroup->getSymbolic() != FILTER_GROUP_TEMPORARY_ONLY);
380
381        $this->update(
382            'UPDATE    filters
383            SET    filter_group_id = ?,
384                display_name = ?,
385                class_name = ?,
386                is_template = ?,
387                parent_filter_id = ?,
388                seq = ?
389            WHERE filter_id = ?',
390            [
391                (int) $filterGroup->getId(),
392                $filter->getDisplayName(),
393                $filter->getClassName(),
394                $filter->getIsTemplate() ? 1 : 0,
 
394                $filter->getIsTemplate() ? 1 : 0,
 
394                $filter->getIsTemplate() ? 1 : 0,
395                $filter->getParentFilterId(),
396                (int) $filter->getSequence(),
397                (int) $filter->getId()
398            ]
399        );
400        $this->updateDataObjectSettings(
401            'filter_settings',
402            $filter,
403            ['filter_id' => $filter->getId()]
404        );
405
406        // Do we update a composite filter?
407        if ($filter instanceof \PKP\filter\CompositeFilter) {
 
409            $this->_deleteSubFiltersByParentFilterId($filter->getId());
410
411            // Re-insert sub-filters
412            $this->_insertSubFilters($filter);
413        }
414    }
 
414    }
376    public function updateObject(PersistableFilter $filter): void
377    {
378        $filterGroup = $filter->getFilterGroup();
379        assert($filterGroup->getSymbolic() != FILTER_GROUP_TEMPORARY_ONLY);
380
381        $this->update(
382            'UPDATE    filters
383            SET    filter_group_id = ?,
384                display_name = ?,
385                class_name = ?,
386                is_template = ?,
387                parent_filter_id = ?,
388                seq = ?
389            WHERE filter_id = ?',
390            [
391                (int) $filterGroup->getId(),
392                $filter->getDisplayName(),
393                $filter->getClassName(),
394                $filter->getIsTemplate() ? 1 : 0,
 
394                $filter->getIsTemplate() ? 1 : 0,
 
394                $filter->getIsTemplate() ? 1 : 0,
395                $filter->getParentFilterId(),
396                (int) $filter->getSequence(),
397                (int) $filter->getId()
398            ]
399        );
400        $this->updateDataObjectSettings(
401            'filter_settings',
402            $filter,
403            ['filter_id' => $filter->getId()]
404        );
405
406        // Do we update a composite filter?
407        if ($filter instanceof \PKP\filter\CompositeFilter) {
 
414    }
376    public function updateObject(PersistableFilter $filter): void
377    {
378        $filterGroup = $filter->getFilterGroup();
379        assert($filterGroup->getSymbolic() != FILTER_GROUP_TEMPORARY_ONLY);
380
381        $this->update(
382            'UPDATE    filters
383            SET    filter_group_id = ?,
384                display_name = ?,
385                class_name = ?,
386                is_template = ?,
387                parent_filter_id = ?,
388                seq = ?
389            WHERE filter_id = ?',
390            [
391                (int) $filterGroup->getId(),
392                $filter->getDisplayName(),
393                $filter->getClassName(),
394                $filter->getIsTemplate() ? 1 : 0,
 
394                $filter->getIsTemplate() ? 1 : 0,
 
394                $filter->getIsTemplate() ? 1 : 0,
395                $filter->getParentFilterId(),
396                (int) $filter->getSequence(),
397                (int) $filter->getId()
398            ]
399        );
400        $this->updateDataObjectSettings(
401            'filter_settings',
402            $filter,
403            ['filter_id' => $filter->getId()]
404        );
405
406        // Do we update a composite filter?
407        if ($filter instanceof \PKP\filter\CompositeFilter) {
 
409            $this->_deleteSubFiltersByParentFilterId($filter->getId());
410
411            // Re-insert sub-filters
412            $this->_insertSubFilters($filter);
413        }
414    }
 
414    }
376    public function updateObject(PersistableFilter $filter): void
377    {
378        $filterGroup = $filter->getFilterGroup();
379        assert($filterGroup->getSymbolic() != FILTER_GROUP_TEMPORARY_ONLY);
380
381        $this->update(
382            'UPDATE    filters
383            SET    filter_group_id = ?,
384                display_name = ?,
385                class_name = ?,
386                is_template = ?,
387                parent_filter_id = ?,
388                seq = ?
389            WHERE filter_id = ?',
390            [
391                (int) $filterGroup->getId(),
392                $filter->getDisplayName(),
393                $filter->getClassName(),
394                $filter->getIsTemplate() ? 1 : 0,
 
394                $filter->getIsTemplate() ? 1 : 0,
 
394                $filter->getIsTemplate() ? 1 : 0,
395                $filter->getParentFilterId(),
396                (int) $filter->getSequence(),
397                (int) $filter->getId()
398            ]
399        );
400        $this->updateDataObjectSettings(
401            'filter_settings',
402            $filter,
403            ['filter_id' => $filter->getId()]
404        );
405
406        // Do we update a composite filter?
407        if ($filter instanceof \PKP\filter\CompositeFilter) {
 
414    }